স্প্রিং ওআরএম (Spring Object-Relational Mapping) জাভা অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে সংযোগ তৈরি করতে ব্যবহার করা হয়। এটি JPA (Java Persistence API) এবং Hibernate এর মতো ORM টুলের সাথে কাজ করতে পারে। তবে, জটিল বা বিশেষ ক্ষেত্রে ডেটাবেস কোয়েরি করার জন্য Native SQL Queries ব্যবহার করতে হয়।
Native SQL Queries ডেটাবেস-নির্দিষ্ট SQL কমান্ড ব্যবহার করে ডেটা ফেচ বা ম্যানিপুলেট করার একটি পদ্ধতি। Hibernate বা JPA এর মাধ্যমে Native SQL ব্যবহার করা সম্ভব, যা ডেটাবেস-অপটিমাইজড কোয়েরি পরিচালনা করে।
@Query
অ্যানোটেশন ব্যবহার করেSpring Data JPA সরাসরি Native SQL কোয়েরি সাপোর্ট করে।
নীচে একটি Native SQL Query ব্যবহার করে টেবিল থেকে ডেটা রিটার্ন করার পদ্ধতি দেখানো হলো:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Query(value = "SELECT * FROM users WHERE status = :status", nativeQuery = true)
List<User> findUsersByStatus(String status);
}
@Query
: Native SQL কোয়েরি ব্যবহার করতে ব্যবহৃত হয়।nativeQuery = true
: নির্দেশ করে যে এটি একটি Native SQL কোয়েরি।:status
: প্যারামিটার বাউন্ডিং।EntityManager এর মাধ্যমে Native SQL কোয়েরি চালানো সম্ভব।
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDao {
@PersistenceContext
private EntityManager entityManager;
public List<Object[]> findUsersWithNativeQuery(String status) {
String sql = "SELECT id, name FROM users WHERE status = :status";
Query query = entityManager.createNativeQuery(sql);
query.setParameter("status", status);
return query.getResultList();
}
}
EntityManager
: Native SQL চালানোর জন্য ব্যবহৃত হয়।createNativeQuery()
: Native SQL কোয়েরি তৈরির জন্য ব্যবহৃত হয়।setParameter()
: প্যারামিটার বাউন্ডিং নিশ্চিত করে।Hibernate এ Named Native Query সংজ্ঞায়িত করা সম্ভব।
import jakarta.persistence.*;
@Entity
@NamedNativeQuery(
name = "User.findByStatus",
query = "SELECT * FROM users WHERE status = ?1",
resultClass = User.class
)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String status;
// Getters and Setters
}
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDao {
@PersistenceContext
private EntityManager entityManager;
public List<User> findByStatus(String status) {
Query query = entityManager.createNamedQuery("User.findByStatus");
query.setParameter(1, status);
return query.getResultList();
}
}
স্প্রিং ওআরএম Hibernate এবং JPA ব্যবহার করে সাধারণ CRUD অপারেশন সহজ করে। তবে, Native SQL Queries ব্যবহার করলে ডেটাবেস-অপটিমাইজড এবং জটিল কোয়েরি কার্যকরভাবে করা যায়। এটি ব্যবহার করার আগে ডেটাবেস নির্ভরতা এবং রক্ষণাবেক্ষণের বিষয়টি বিবেচনা করা গুরুত্বপূর্ণ।
Native SQL Query হলো ডাটাবেজে সরাসরি SQL স্টেটমেন্ট রান করার একটি পদ্ধতি। Hibernate বা Spring ORM সাধারণত HQL (Hibernate Query Language) বা Criteria API ব্যবহার করে ডাটাবেজের সাথে ইন্টারঅ্যাক্ট করে। তবে, কিছু বিশেষ ক্ষেত্রে যেখানে কাস্টম SQL স্টেটমেন্ট প্রয়োজন হয় (যেমন জটিল যোগ বা নির্দিষ্ট ডাটাবেস ফিচার ব্যবহার), সেখানে Native SQL Query ব্যবহার করা হয়।
Spring ORM এ Native SQL Query ব্যবহার করার জন্য @Query
অ্যানোটেশন বা Hibernate এর createNativeQuery
মেথড ব্যবহার করা হয়। নিচে এর বিভিন্ন প্রয়োগ দেখানো হলো।
Hibernate এর Session
অবজেক্ট ব্যবহার করে Native SQL Query রান করা যায়।
EmployeeDAO.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
public List<Object[]> getEmployeesWithNativeQuery() {
Session session = sessionFactory.getCurrentSession();
String sql = "SELECT id, name, department FROM Employee";
return session.createNativeQuery(sql).getResultList();
}
}
Spring Data JPA ব্যবহার করে @Query
অ্যানোটেশন দিয়ে Native SQL Query রান করা যায়।
EmployeeRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query(value = "SELECT * FROM Employee WHERE department = :department", nativeQuery = true)
List<Employee> findByDepartment(String department);
}
Hibernate-এর জন্য hibernate.cfg.xml
বা Spring এর applicationContext.xml
ফাইলে কনফিগারেশন সঠিকভাবে সম্পন্ন করুন।
SQL স্টেটমেন্ট সরাসরি লিখুন এবং Hibernate বা Spring JPA থেকে রান করুন।
Native Query-তে ডাইনামিক ডেটা পাস করার জন্য Named Parameters বা Indexed Parameters ব্যবহার করা যায়।
EmployeeRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query(value = "SELECT * FROM Employee WHERE name = :name AND department = :department", nativeQuery = true)
List<Employee> findByNameAndDepartment(@Param("name") String name, @Param("department") String department);
}
Native Query এর মাধ্যমে নির্দিষ্ট কলামগুলোর জন্য Projection ব্যবহার করা যায়।
Custom DTO তৈরি করুন
public class EmployeeDTO {
private String name;
private String department;
public EmployeeDTO(String name, String department) {
this.name = name;
this.department = department;
}
// Getters and Setters
}
EmployeeRepository.java
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query(value = "SELECT name, department FROM Employee", nativeQuery = true)
List<Object[]> findAllEmployeeDetails();
default List<EmployeeDTO> findAllAsDTO() {
List<Object[]> results = findAllEmployeeDetails();
return results.stream()
.map(row -> new EmployeeDTO((String) row[0], (String) row[1]))
.toList();
}
}
Native SQL Query Spring ORM এবং Hibernate ব্যবহারকারীদের জন্য একটি গুরুত্বপূর্ণ টুল, যা ডাটাবেসের বিশেষ ফিচার বা জটিল কোয়েরি পরিচালনায় সহায়ক।
Spring Data JPA-তে @Query
অ্যানোটেশনটি ব্যবহার করে কাস্টম SQL বা HQL (Hibernate Query Language) কোয়েরি লেখা যায়। এটি এমন ক্ষেত্রে কার্যকর যখন ডিফল্ট মেথড বা কোয়েরিগুলো অ্যাপ্লিকেশনের চাহিদা পূরণ করতে পারে না।
:parameterName
) বা পজিশনাল প্যারামিটার (?index
) ব্যবহার করা যায়।nativeQuery = true
ব্যবহার করা হয়।Spring Data JPA ব্যবহার করতে নিম্নোক্ত ডিপেনডেন্সি যোগ করতে হবে:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
@Column(name = "age")
private int age;
// Getters and Setters
}
JPA রেপোজিটরি ইন্টারফেস তৈরি করে কাস্টম SQL কোয়েরি সংজ্ঞায়িত করা যাবে।
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
// Custom Query to find users by name
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findUsersByName(@Param("name") String name);
// Custom Query to find users above a certain age
@Query("SELECT u FROM User u WHERE u.age > ?1")
List<User> findUsersAboveAge(int age);
// Native SQL Query to fetch users by email
@Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true)
User findUserByEmail(String email);
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getUsersByName(String name) {
return userRepository.findUsersByName(name);
}
public List<User> getUsersAboveAge(int age) {
return userRepository.findUsersAboveAge(age);
}
public User getUserByEmail(String email) {
return userRepository.findUserByEmail(email);
}
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/by-name/{name}")
public List<User> getUsersByName(@PathVariable String name) {
return userService.getUsersByName(name);
}
@GetMapping("/above-age/{age}")
public List<User> getUsersAboveAge(@PathVariable int age) {
return userService.getUsersAboveAge(age);
}
@GetMapping("/by-email")
public User getUserByEmail(@RequestParam String email) {
return userService.getUserByEmail(email);
}
}
Spring ORM এ @Query
অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি তৈরি ডাটাবেস অপারেশনকে আরও সুনিয়ন্ত্রিত এবং কার্যকর করতে সাহায্য করে।
Spring ORM এর মাধ্যমে Native SQL Query ব্যবহার করে সরাসরি ডেটাবেজের সাথে কাজ করা যায়। Hibernate এবং JPA উভয়ই Native SQL Query সাপোর্ট করে। যখন জটিল বা নির্দিষ্ট ডেটাবেজ অপারেশন প্রয়োজন হয়, তখন Native SQL Query ব্যবহার কার্যকর হতে পারে।
Spring ORM Hibernate ইন্টিগ্রেশন ব্যবহার করলে Hibernate এর createSQLQuery() এবং JPA এর @Query বা EntityManager.createNativeQuery() মেথডের মাধ্যমে Native SQL Query পরিচালনা করা যায়।
@Transactional
public List<Object[]> getEmployeesByDepartment(String department) {
String sql = "SELECT e.id, e.name, e.salary FROM employee e WHERE e.department = :department";
Query query = sessionFactory.getCurrentSession().createSQLQuery(sql);
query.setParameter("department", department);
return query.list();
}
বর্ণনা:
createSQLQuery()
ব্যবহার করে Native SQL Query তৈরি করা হয়।setParameter()
দিয়ে প্যারামিটার সেট করা হয়।list()
মেথড ব্যবহার করে রেজাল্ট রিটার্ন করা হয়।@Repository
public class EmployeeRepository {
@PersistenceContext
private EntityManager entityManager;
public List<Object[]> getEmployeesByDepartment(String department) {
String sql = "SELECT e.id, e.name, e.salary FROM employee e WHERE e.department = :department";
Query query = entityManager.createNativeQuery(sql);
query.setParameter("department", department);
return query.getResultList();
}
}
বর্ণনা:
createNativeQuery()
মেথড ব্যবহার করা হয়।setParameter()
দিয়ে SQL প্যারামিটার সেট করা হয়।getResultList()
মেথড রেজাল্ট লিস্ট আকারে প্রদান করে।JPA এর ক্ষেত্রে @Query অ্যানোটেশন ব্যবহার করে Native SQL Query লেখা যায়।
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query(value = "SELECT * FROM employee e WHERE e.department = :department", nativeQuery = true)
List<Employee> findByDepartment(@Param("department") String department);
}
বর্ণনা:
@Query
এর মাধ্যমে SQL কোয়েরি সরাসরি লেখা হয়।nativeQuery = true
নির্দেশ করে এটি একটি Native Query।@Param
ব্যবহার করে প্যারামিটার পাস করা হয়।@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public List<Employee> getEmployeesByDepartment(String department) {
return employeeRepository.findByDepartment(department);
}
}
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/department/{department}")
public List<Employee> getEmployeesByDepartment(@PathVariable String department) {
return employeeService.getEmployeesByDepartment(department);
}
}
Spring ORM ব্যবহার করে Native SQL Query ডেটাবেজ অপারেশনে নমনীয়তা প্রদান করে। এর মাধ্যমে জটিল কোয়েরি সহজে বাস্তবায়ন করা যায় এবং Spring এর ট্রানজেকশন ব্যবস্থাপনার সুবিধাও উপভোগ করা যায়।
Read more